package com.example.myapplication.designmode.single;

import java.util.HashMap;
import java.util.Map;

/**
 * 单列模式的使用练习
 */
public class Singleton {


    /**
     * 饿汉单列
     * <p>
     * 优点：对象优先创建，无须等待，效率高。
     * 缺点：申明静态对象的时候就已经初始化，一定程度上造成了资源的浪费
     */
/**
 private static final Singleton INSTANCE = new Singleton();

 private Singleton() {
 }

 public static Singleton getInstance() {
 return INSTANCE;
 }
 */


    /**
     * 懒汉模式
     * <p>
     * 优点：只有在使用时才会被实例化，一定程度上节约了资源。
     * 缺点：第一次加载时需要等待，同时每一次调用getInstance()都进行同步，造成不必要的同步开销。
     */
/**
 private static Singleton instance;

 private Singleton() {
 }

 public synchronized static Singleton getInstance() {
 if (instance == null) {
 instance = new Singleton();
 }
 return instance;
 }
 */


    /**
     * DCL(Double Check Lock)单例
     * <p>
     * volatile关键字的作用：
     * <p>
     * 1. 禁止指令重排序；
     * instance = new Singleton();这句代码实际上并不是一个原子操作，最终会被编译成多条汇编指令，大致做了如下3件事；
     * <p>
     * （1）给Singleton的实例分配内存；
     * （2）调用Singleton()的构造函数，初始化成员字段；
     * （3）将instance对象指向分配的内存空间（此时instance不再为null）
     * <p>
     * 但是Java编译器允许处理器乱序执行，以上的执行顺序可能是1-2-3也可能是1-3-2，如果是后者，在线程A中当3执行完毕2未执行时，如果切换到线程B，此时instance已经非空，线程B直接取走instance，在使用就会出错，这就会导致DCL失效！！
     * <p>
     * 线程可见性，及时更新实例到主内存；【JMM Java内存模型】
     * <p>
     * getInstance()方法中两次判空的作用：
     * <p>
     * 第一次：避免重复加锁，造成资源浪费；
     * 第二次：避免对象重复实例化；
     * <p>
     * 优点：资源利用率高，避免不必要的同步；
     * 缺点：第一次加载效率低，在某些情况下会出现DCL失效问题；
     * ————————————————
     * <p>
     * 2.     线程可见性，及时更新实例到主内存；【JMM Java内存模型】
     * <p>
     * getInstance()方法中两次判空的作用：
     * <p>
     * 第一次：避免重复加锁，造成资源浪费；
     * 第二次：避免对象重复实例化；
     * <p>
     * 优点：资源利用率高，避免不必要的同步；
     * 缺点：第一次加载效率低，在某些情况下会出现DCL失效问题；
     * ————————————————
     * 版权声明：本文为CSDN博主「惜许」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
     * 原文链接：https://blog.csdn.net/a734474820/article/details/128381658
     */

    /**
     public volatile static Singleton instance;

     private Singleton() {
     }

     public static Singleton getInstance() {
     if (instance == null) {
     synchronized (Singleton.class) {
     if (instance == null) {
     instance = new Singleton();
     }
     }
     }
     return instance;
     }
     */


    /**
     * 静态内部类单例
     *优点：懒加载，能够确保线程安全，推荐使用这种单例模式实现方式！
     */

    /**
     private Singleton(){}

     public static Singleton getInstance() {
     return SingletonHolder.instance;

     }

     private static class SingletonHolder {
     private static final Singleton instance = new Singleton();
     }
     */


//    class SingletonManager

    /**
     * 容器实现单例模式
     * <p>
     * 优点：可以管理多种类型的单例，使用时可以通过统一的接口进行获取操作，降低用户使用成本，也对用户隐藏了具体实现，降低耦合度。
     */
    private static Map<String, Object> singletonMap = new HashMap<>();

    private Singleton() {
    }

    public static void registerService(String key, Object instance) {
        if (!singletonMap.containsKey(key)) {
            singletonMap.put(key, instance);
        }
    }

    public static Object getService(String key) {
        if (singletonMap.containsKey(key)) {
            return singletonMap.get(key);
        }
        return null;
    }


    public static Object deleteService(String key) {
        if (singletonMap.containsKey(key)) {
            return singletonMap.remove(key);
        }
        return null;
    }


/**
 *
 *   工厂模式   案例    地址   https://blog.csdn.net/liu649983697/article/details/113181670
 *                          https://www.jb51.net/article/237497.htm
 *
 *    建造者模式             https://blog.csdn.net/zyj1051574045/article/details/122529856
 *                         https://www.cnblogs.com/blessing2022/p/16622132.html
 *
 *    原型模式               https://blog.csdn.net/GXL_1012/article/details/110697058
 *
 *    享元模式               https://blog.csdn.net/m0_51750419/article/details/127332662
 *                         https://www.cnblogs.com/lixin-link/p/11104658.html
 *
 *    门面(外观)模式          https://baijiahao.baidu.com/s?id=1664406349337163033&wfr=spider&for=pc
 *                         https://segmentfault.com/a/1190000019744173
 *
 *     适配器模式            https://blog.csdn.net/a745233700/article/details/83628122
 *                         http://www.tianqiweiqi.com/java-design-pattern-03.html
 *
 *     装饰器模式             https://www.cnblogs.com/xrq730/p/4908940.html
 *                           https://blog.csdn.net/weixin_43598687/article/details/122086769
 *
 *     策略模式                https://www.cnblogs.com/blessing2022/p/16622127.html
 *                           https://blog.csdn.net/lt_xiaodou/article/details/127007575
 *
 *
 */


}
